Vectors
Hadi vektörlere ve bu vektörler ile bağdaştırılan yöntemlere bakalım. Hadi bir i32
türünde numaralar
adında boş bir vektör oluşturarak başlayalım ve bu vektöre push
methodu ile bazı veriler yükleyelim.
fn main(){
let mut numaralar:Vec<i32> = vec![];
numaralar.push(1);
numaralar.push(2);
numaralar.push(3);
}
Vektörler içerisinden bir veriyi çıkartmak için .pop()
yönetmini kullanabiliriz. Bu yöntem o vektör içerisindeki son elemanı vektör içerisinden çıkaracak ancak kendini de çıkardığı değere ekleyecektir. Yani bir pop
methodunu insan gibi düşünebiliriz. Vektörü de bir çamaşır sepeti. Biz bir pop
işlem yaptığımızda her nasıl en sondaki en üstteki kıyafeti sepetten çıkarıyorsak ve her nasıl ki sepetten çıkarırken elimizde kalan sepetten çıkardığımız oluyorsa aynı durum pop
methodu için de geçerlidir.
fn main(){
let mut numaralar:Vec<i32> = vec![];
numaralar.push(1);
numaralar.push(2);
numaralar.push(3);
let poped = numaralar.pop();
println!("{:?}", numaralar); // [1,2]
println!("{:?}", poped); // Some(3)
}
Pop methodu boş bir liste içerisinde çıkarmaya çalışınca
none
değeri döndüreceği için bu methodSome(T)
veyaNone
değeri döndürecektir.
Aynı zamanda vektör içerisinden bir elemana erişirken numaralar[INDEX]
yapısını da kullanabiliriz. Burada dikkat etmemiz gereken şey bir i32 gibi stack üzerinde kayıtlı veri tiplerinin copy
türünü kullanırken diğer heap
üzerinde tutulan veriler için &numaralar[INDEX]
yapısı ile copy
oluşturulamıyorsa referans
oluşturmamızdır.
Vektörler içerisinden verileri elde etmenin birçok yolu vardır. Bunlardan bir diğeri de vektör içerisindeki ilk değeri elde etmemizi sağlayan .first()
yapısı ve son veriyi elde etmemizi sağlayan .last()
methodudur.
let mut numaralar:Vec<i32> = vec![];
numaralar.push(1);
numaralar.push(2);
let bir = numaralar.first()
println!{"{:?}", bir} // Some(1)
let son = numaralar.last()
println!{"{:?}", son} // Some(2)
Aynı zamanda ownership
bakımından daha sağlıklı olması amacıyla bu fonksiyonları mutable referans
hali ile kontrol eden hallerini de first_mut
ve last_mut
şeklinde kullanabiliriz.
Eğer vektörümüzün uzunluğunu kontrol etmek istiyorsak bu işlemi .len()
yapısını da kullanabiliriz. Bu işlem sayesinde belirli bir listenin uzunluğunda döngüler çalıştırabiliriz. Aynı şekilde bir listenin dolu veya boş olduğunu da kontrol etmek mümkündür. Bu işlemi .is_empty()
yapısı ile geçekleştirebiliriz. Bu işlem bool
döndürecektir.
let mut numaralar:Vec<i32> = vec![];
numaralar.push(1);
numaralar.push(2);
let uzunluk = numaralar.len()
println!{"{:?}", uzunluk} // 2
let son = numaralar.is_empty()
println!{"{:?}", son} // False
Daha öncesinde bir listenin içerisine sona ekleme yapmak için .push
methodunu kullanmıştık. Ancak bu işlemi spesifik indexler için .insert()
methodunu kullanarak yapmamız da mümkündür.
numaralar.insert(1,12); // 1. indexe 12 değerini yerleştirecek
Her nasıl bir vektör içerisindeki son elemanı pop
ile çıkarıyorsak aynı şekilde istediğimiz elemanı .remove()
yapısı ile de çıkarmamız mümkündür.
numaralar.remove(1); // 1. index'i vektörden çıkar
Ayrıca bir vektörün içerisindeki verileri .sort()
ile de alfabetik ve nümerik olarak sıralayabiliriz.
Bazı durumlarda bir listeyi ters çevirmek de işimize yarayabilmektedir. Bu işlemi yaparken de reverse()
yapısını kullanabiliriz.
Ayrıca vektörlerimizi karıştırmakta mümkündür. Bu işlem için ilk olarak cargo.toml
dosyasına gitmemiz ve bu dosya içerisinde dependencies
başlığı altına rand
paketi eklemek istediğimizi belirtmemiz gerekmektedir.
[dependencies]
rand = "0.8.4"
Sonrasında geri main.rs
dosyamıza gelerek paketimizi ekleyebiliriz.
use rand::seg::SliceRandom;
use rand::thread_rng;
Sonrasında vektörümüzü karıştırmak için alt kısımda kullanılan kodu sistemimize ekleyebiliriz.
nums.suffle(&mut thread_rng());